package com.demo.cms.service;

import java.util.List;

import com.demo.cms.model.Navi;
import com.demo.cms.model.RoleNavi;
import com.demo.core.dao.base.support.ResultSearchResult;
import com.demo.core.dao.base.support.SearchArgumentSupport;
import com.demo.core.model.support.AdjacencyListModel;

/**
 * 导航服务接口
 * 
 * @author ryuu.kk
 *
 */
public interface NaviService {

	/**
	 * 增加导航
	 * @param navi 导航模型
	 * @return 主键ID
	 */
	Long save(Navi navi);
	
	/**
	 * 增加导航,包含导航的权限设定
	 * @param navi 导航模型
	 * @param roleNaviList 角色-导航关联模型
	 * @return 主键ID
	 */
	Long save(Navi navi, List<RoleNavi> roleNaviList);
	
	/**
	 * 导航模型是否存在
	 * @param id 外键ID
	 * @return 是否存在
	 */
	boolean exists(Long id);
	
	/**
	 * 更新导航
	 * 其中包括：
	 * 	NAME, TITLE, CHANNEL_ID
	 *  CATEGORY_ID, ARTICLE_ID
	 *  CSS, STYLE, TYPE, URL
	 *  PATTERN, IS_ANONYMOUS 
	 * @param id 导航ID
	 * @param navi Navi导航模型
	 */
	void update(Long id, Navi navi);
	
	/**
	 * 更新导航
	 * @param id 导航ID
	 * @param enabled 可用标志
	 * @param status 状态位
	 */
	void update(Long id, boolean enabled, String status);
	
	/**
	 * 删除导航
	 * @param id 扩展属性ID
	 */
	void delete(Long id);
	
	/**
	 * 删除站点下的所有导航
	 * @param siteId 站点ID
	 */
	void deleteAll(Long siteId);
	
	/**
	 * 删除角色-导航模型
	 * @param siteId 站点ID
	 * @param roleNaviId 角色-导航模型ID 
	 */
	void deleteRoleNavi(Long siteId, Long roleNaviId);
	
	/**
	 * 删除角色-导航模型
	 * @param siteId 站点ID
	 * @param naviId 导航模型ID
	 * @param roleId 角色ID 
	 */
	void deleteRoleNavi(Long siteId, Long naviId, Long roleId);
	
	/**
	 * 通过ID查询导航
	 * @param id 导航ID
	 * @return 导航
	 */
	Navi find(Long id);
	
	/**
	 * 查询站点所有导航
	 * @param siteId 站点ID
	 * @return 导航列表
	 */
	List<Navi> findList(Long siteId);
	
	/**
	 * 查询站点指定父ID的导航列表
	 * @param siteId 站点ID
	 * @param pid 导航ID
	 * @return 导航列表
	 */
	List<Navi> findList(Long siteId, Long pid);
	
	/**
	 * 查询站点所有导航
	 * @param siteId 站点ID
	 * @param channelId 频道ID
	 * @param categoryId 栏目ID
	 * @param articleId 文章ID
	 * @return 导航列表
	 */
	List<Navi> findList(Long siteId, Long channelId, Long categoryId, Long articleId);
	
	/**
	 * 通过站点ID和导航ID查询包含角色信息在内的导航信息
	 * @param siteId 站点ID
	 * @param id 导航ID
	 * @return 导航信息(包含角色)
	 */
	Navi query(Long siteId, Long id);
	
	/**
	 * 查询站点指定角色的导航
	 * @param siteId 站点ID
	 * @param roleId 角色ID
	 * @param level 层级Level
	 * @return List<Navi> 返回导航列表
	 */
	List<Navi> query(Long siteId, Long roleId, int... level);
	
	/**
	 * 查询站点的指定导航
	 * 频道ID、栏目ID、文章ID可为空<br>
	 * 
	 * @param siteId 站点ID
	 * @param channelId 频道ID
	 * @param categoryId 栏目ID
	 * @param articleId 文章ID
	 * @param level 层级Level
	 * @return List<Navi> 返回导航列表
	 */
	List<Navi> query(Long siteId, Long channelId, Long categoryId, Long articleId, int... level);
	
	/**
	 * 根据导航ID和层级level查询树形结构的导航
	 * @param siteId 站点ID
	 * @param level 层级ID(即树的深度n{0,n})
	 * @return AdjacencyListModel 邻接树形结构模型
	 */
	AdjacencyListModel queryTree(Long siteId, int... level);
	
	/**
	 * 根据导航ID和层级level查询树形结构的导航
	 * @param siteId 站点ID
	 * @param id 导航ID
	 * @param enabled 角色是否可用
	 * @param level 层级ID(即树的深度n{0,n})
	 * @return AdjacencyListModel 邻接树形结构模型
	 */
	AdjacencyListModel queryTree(Long siteId, Long id, Boolean enabled, int... level);
	
	/**
	 * 根据导航ID和层级level查询树形结构的导航
	 * @param siteId 站点ID
	 * @param id 导航ID
	 * @param roleId 角色ID
	 * @param enabled 角色是否可用
	 * @param level 层级ID(即树的深度n{0,n})
	 * @return AdjacencyListModel 邻接树形结构模型
	 */
	AdjacencyListModel queryTree(Long siteId, Long id, Long roleId, Boolean enabled, int... level);
	
	/**
	 * 分页查询导航模型列表
	 * @param siteId 站点ID
	 * @param firstResult 起点数据
	 * @param maxResults 最大结果集
	 * @return ResultSearchResult<Navi>
	 */
	ResultSearchResult<Navi> search(Long siteId, int firstResult, int maxResults);
	
	/**
	 * 分页查询导航模型列表
	 * @param siteId 站点ID
	 * @param args 分页封装对象
	 * @return ResultSearchResult<Navi>
	 */
	ResultSearchResult<Navi> search(Long siteId, SearchArgumentSupport args);
	
	/**
	 * 分页查询导航模型列表
	 * @param siteId 站点ID
	 * @param pid 导航父节点ID
	 * @param args 分页封装对象
	 * @return ResultSearchResult<Navi>
	 */
	ResultSearchResult<Navi> search(Long siteId, Long pid, SearchArgumentSupport args);
	
	/**
	 * 取得默认Navi模型
	 * @param siteId 站点ID
	 * @return Navi 导航模型
	 */
	Navi getDefaultModel(Long siteId);

}
